"""
!/usr/bin/env python
-*- coding: utf-8 -*-
@Author  : MarkJia
@Site    : 
@File    : 6、集合.py
"""

"""
集合定义：
    无序的唯一对象集合
    用{}包围，对象之间用逗号分隔
    集合是动态的，可以随时添加或者删除元素
    集合是异构的，可以包含不同类型的数据
    可以交集、并集。差集运算
"""

# 值的唯一性
set1 = {1, 2, 3, 4, 5, 6}
print(type(set1), set1)  # 结果：<class 'set'> {1, 2, 3, 4, 5, 6}

# 通过构造方法， 后面跟可迭代对象：字符串、列表。元组、集合、字典
set10 = set('python')
print(type(set10), set10)  # 结果：<class 'set'> {'n', 'h', 'p', 'y', 't', 'o'}

# 集合推导式
set2 = {i for i in range(5) if i % 2 == 0}
print(type(set2), set2)  # range是从0开始的。结果：<class 'set'> {0, 2, 4}

# 成员运算  in 、 not in
print(0 in set2)  # set2 = {0, 2, 4}。结果：True

"""
集合的方法：
    添加方法 : add()  update()
    删除方法 : remove()  discard()  pop()   clear()
"""

# 集合方法 add(目标值)
set2.add(6)
print(set2)  # set2 = {0, 2, 4}。结果：{0, 2, 4, 6}
set2.add('python')
print(set2)  # {0, 2, 4,'python'}

# update 加入可迭代对象(可以用for遍历的对象)
set2 = {0, 2, 4}
set2.update('goodstudy')
print(type(set2), set2)  # 结果：<class 'set'> {0, 't', 2, 4, 'g', 'y', 'o', 'u', 's', 'd'}
set2.update([1, 2, 3])
print(set2)  # {0, 1, 2, 3, 4, 't', 'y', 'd', 'u', 'o', 'g', 's'}

# remove(目标值) 移除一个值  移除的值不存在会报错
set3 = {1, 2, 3, 4, 5, 'good'}
print(set3)  # 结果：{1, 2, 3, 4, 5, 'good'}
set3.remove(2)
print(set3)  # 将2删除。结果：{1, 3, 4, 5, 'good'}
# 移除的值不存在会报错
set3.remove(100)
print(set3)  # 报错 ： KeyError: 100

# discard()  对象在集合中存在，则将其移除。元素不存在也不会报错
st = {1, 32, 3}
st.discard(1)
print(st)  # {32，3}
# 元素不存在也不会报错
st.discard(100)
print(st)

# pop ： 随机从集合中移除并返回一个元素。如果集合为空，则会引发 KeyError
st = {1, 32, 3}
st.pop()
print(st)

# clear() 清除集合所有的元素
st = {1, 32, 3}
st.clear()
print(st)  # 结果 ： set()

# =========================================================


# 集合的交并差值
set4 = {1, 8}
set5 = {8, 81}

# 交集  结果：{8}
print(set4.intersection(set5))
print(set4 & set5)

# 并集 结果：{8, 1, 81}
print(set4.union(set5))
print(set4 | set5)

# 差值  结果：{1}  只属于集合4，不属于集合5的元素
print(set4.difference(set5))
print(set4 - set5)

# 查找 hogwarts  与  hello world 中相同的字符
set1 = set()
for i in 'hogwartsss':
    if i in 'hello world':
        set1.add(i)
print(set1)  # 结果：{'h', 'o', 'w', 'r'}

# 集合推导式
set2 = {i for i in 'hogwartsss' if i in 'hello world'}
print(set2)  # 结果：{'h', 'o', 'w', 'r'}
